Figura 1.1 logito(número de SADs não refutadas) ~ p * k * MN. A linha azul é uma estimativa baseada em ‘loess’.
A figura 1.1 mostra que o padrão geral dos dados não é linear na escala da função de ligação, assim utilizamos GAM. Possibilitamos até 1 intercepto por modelo neutro por sítio de amostragem (MN|SiteCode); para modelos com variáveis de dispersão continua não foi possível um smoother por Sítio de Amostragem e Modelo Neutro
l_md <- vector("list",11)
names(l_md) <- c("k0 1|Site","k0 MN|Site","k0 k0*MN|Site",
"kf 1|Site","kf MN|Site",
"d 1|Site","d MN|Site","d d*MN|Site",
"d/L_plot 1|Site","d/L_plot MN|Site","d/L_plot d/L_plot*MN|Site")
l_md[[1]] <- glmer(cbind(n_nRef,100-n_nRef) ~ p.z * k_1.z * MN + I(p.z^2) * k_1.z * MN + (1|SiteCode),
family = "binomial",data=df_resultados,
control=glmerControl(optimizer="bobyqa",optCtrl=list(maxfun=100000)))
l_md[[2]] <- glmer(cbind(n_nRef,100-n_nRef) ~ p.z * k_1.z * MN + I(p.z^2) * k_1.z * MN + (MN|SiteCode),
family = "binomial",data=df_resultados,
control=glmerControl(optimizer="bobyqa",optCtrl=list(maxfun=100000)))
l_md[[3]] <- glmer(cbind(n_nRef,100-n_nRef) ~ p.z * k_1.z * MN + I(p.z^2) * k_1.z * MN + (k_1.z*MN|SiteCode),
family = "binomial",data=df_resultados,
control=glmerControl(optimizer="bobyqa",optCtrl=list(maxfun=100000)))
l_md[[4]] <- glmer(cbind(n_nRef,100-n_nRef) ~ p.z * k * MN + I(p.z^2) * k * MN + (1|SiteCode),
family = "binomial",data=df_resultados,
control=glmerControl(optimizer="bobyqa",optCtrl=list(maxfun=100000)))
l_md[[5]] <- glmer(cbind(n_nRef,100-n_nRef) ~ p.z * k * MN + I(p.z^2) * k * MN + (MN|SiteCode),
family = "binomial",data=df_resultados,
control=glmerControl(optimizer="bobyqa",optCtrl=list(maxfun=100000)))
l_md[[6]] <- glmer(cbind(n_nRef,100-n_nRef) ~ p.z * d.z * MN + I(p.z^2) * d.z * MN + (1|SiteCode),
family = "binomial",data=df_resultados,
control=glmerControl(optimizer="bobyqa",optCtrl=list(maxfun=100000)))
l_md[[7]] <- glmer(cbind(n_nRef,100-n_nRef) ~ p.z * d.z * MN + I(p.z^2) * d.z * MN + (MN|SiteCode),
family = "binomial",data=df_resultados,
control=glmerControl(optimizer="bobyqa",optCtrl=list(maxfun=100000)))
l_md[[8]] <- glmer(cbind(n_nRef,100-n_nRef) ~ p.z * d.z * MN + I(p.z^2) * d.z * MN + (d.z*MN|SiteCode),
family = "binomial",data=df_resultados,
control=glmerControl(optimizer="bobyqa",optCtrl=list(maxfun=100000)))
l_md[[9]] <- glmer(cbind(n_nRef,100-n_nRef) ~ p.z * d_Lplot.z * MN + I(p.z^2) * d_Lplot.z * MN + (1|SiteCode),
family = "binomial",data=df_resultados,
control=glmerControl(optimizer="bobyqa",optCtrl=list(maxfun=100000)))
l_md[[10]] <- glmer(cbind(n_nRef,100-n_nRef) ~ p.z * d_Lplot.z * MN + I(p.z^2) * d_Lplot.z * MN + (MN|SiteCode),
family = "binomial",data=df_resultados,
control=glmerControl(optimizer="bobyqa",optCtrl=list(maxfun=100000)))
l_md[[11]] <- glmer(cbind(n_nRef,100-n_nRef) ~ p.z * d_Lplot.z * MN + I(p.z^2) * d_Lplot.z * MN + (d_Lplot.z*MN|SiteCode),
family = "binomial",data=df_resultados,
control=glmerControl(optimizer="bobyqa",optCtrl=list(maxfun=100000)))
Tabela 1.1 AICctab
## dAICc df weight
## d d*MN|Site 0.0 22 1
## d/L_plot d/L_plot*MN|Site 136.6 22 <0.001
## k0 k0*MN|Site 7272.3 22 <0.001
## kf MN|Site 35211.1 123 <0.001
## d MN|Site 60068.1 15 <0.001
## d/L_plot MN|Site 60179.8 15 <0.001
## k0 MN|Site 61601.1 15 <0.001
## kf 1|Site 65788.2 121 <0.001
## d 1|Site 91101.2 13 <0.001
## d/L_plot 1|Site 91273.1 13 <0.001
## k0 1|Site 93015.1 13 <0.001
O único modelo plausível é aquele com função de ligação logito, a variável d e a estrutura aleatória MN * d |SiteCode.
Figura 1.2 Resíduos Quantílicos do modelo cheio para n_nRef ~ pdMN + p^2dMN + (d*MN|SiteCode)
NOTA: não entendo o motivo de não rodar os resíduos quantílicos quando compilo o Rmarkdown:
mensagem de erro:
Error in if (family$family %in% c(“binomial”,“poisson”,“quasibinomial”, : argumento tem comprimento zero Calls:
Figura 1.3 Predito e observado por SiteCode
Observamos que é necessário considerar também um termo quadrático para d. Então sigo com a adição de um termo quadrático para d
Tabela 1.2 R2 condicional e marginal do modelo cheio com termo quadrático para p e d
md_nRef2 <- glmer(cbind(n_nRef,100-n_nRef) ~
(p.z + I(p.z^2)) * (d.z + I(d.z^2)) * MN + ((d.z + I(d.z^2)) * MN|SiteCode),
family = "binomial",data=df_resultados,
control=glmerControl(optimizer="bobyqa",optCtrl=list(maxfun=100000)))
r.squaredGLMM(md_nRef2)
## R2m R2c
## theoretical 0.2153057 0.9548503
## delta 0.2128725 0.9440595
Figura 1.4 Resíduos quantílicos para o modelo cheio com termos quadráticos para p e d.
Figura 1.5 Predito pelo modelo com termo quadrático para p e d
O modelo cheio com termo quadrático para p e d não foi foi suficiente para descrever o padrão observado nos dados. Hipotetizamos que a razão é a divergência no grau de variação entre os modelos neutros. Assim iremos ajustar modelos para cada conjunto de dados. Para possibilitar a comparação irei manter a estrutura comum das preditoras porem comparando a estrutura aleatória e função de ligação para cada modelo neutro.
l_md <- vector("list",3)
names(l_md) <- c("1|Site","d|Site","d + d^2|Site")
l_md[[1]] <- glmer(cbind(n_nRef,100-n_nRef) ~
( p.z + I(p.z^2) ) * ( d.z + I(d.z^2) ) +
(1|SiteCode),
family = "binomial",data=filter(df_resultados,MN=="EE"),
control=glmerControl(optimizer="bobyqa",optCtrl=list(maxfun=100000)))
l_md[[2]] <- glmer(cbind(n_nRef,100-n_nRef) ~
( p.z + I(p.z^2) ) * ( d.z + I(d.z^2) ) +
(d.z|SiteCode),
family = "binomial",data=filter(df_resultados,MN=="EE"),
control=glmerControl(optimizer="bobyqa",optCtrl=list(maxfun=100000)))
l_md[[3]] <- glmer(cbind(n_nRef,100-n_nRef) ~
( p.z + I(p.z^2) ) * ( d.z + I(d.z^2) ) +
(d.z + I(d.z^2)|SiteCode),
family = "binomial",data=filter(df_resultados,MN=="EE"),
control=glmerControl(optimizer="bobyqa",optCtrl=list(maxfun=100000)))
Tabela 1.2.1 AICctab para n_nRef MNEE
## dAICc df weight
## d + d^2|Site 0.0 15 1
## d|Site 2588.4 12 <0.001
## 1|Site 20757.2 10 <0.001
O modelo mais plausível considera um termo linear e quadrático para d na estrutura aletória.
Figura 1.6 Resíduos Quantílicos do glmm cheio para MNEE
Tabela 1.2.2 R2 condicional e marginal modelo cheio nRef
## R2m R2c
## theoretical 0.056151582 0.9244036
## delta 0.006904096 0.1136597
# dados
df_md <- filter(df_resultados,MN=="EE")
# modelo global
global_md <- glmer(cbind(n_nRef,100-n_nRef) ~
( p.z + I(p.z^2) ) * ( d.z + I(d.z^2) ) +
(d.z + I(d.z^2)|SiteCode),
family = "binomial",data=df_md,
control=glmerControl(optimizer="bobyqa",optCtrl=list(maxfun=100000)),na.action = "na.fail")
Tabela 1.2.3 R2 condicional e marginal do modelo global
## Global model call: glmer(formula = cbind(n_nRef, 100 - n_nRef) ~ (p.z + I(p.z^2)) *
## (d.z + I(d.z^2)) + (d.z + I(d.z^2) | SiteCode), data = df_md,
## family = "binomial", control = glmerControl(optimizer = "bobyqa",
## optCtrl = list(maxfun = 1e+05)), na.action = "na.fail")
## ---
## Model selection table
## (Int) d.z d.z^2 p.z p.z^2 d.z:p.z d.z:I(p.z^2) I(d.z^2):p.z
## 30 3.856 -0.3820 0.4117 -1.179 0.8548
## 32 3.884 -0.3320 0.07890 0.4111 -1.182 0.8581
## 62 3.861 -0.4017 0.4087 -1.183 0.8656 0.019820
## 96 3.885 -0.3384 0.07500 0.3676 -1.184 0.7767 -0.1387
## 64 3.888 -0.3493 0.07873 0.4084 -1.186 0.8674 0.017350
## 160 3.889 -0.3312 0.09039 0.4094 -1.187 0.8608
## 224 3.955 -0.3349 0.21910 0.3254 -1.252 0.7652 -0.2256
## 128 3.887 -0.3466 0.07493 0.3664 -1.186 0.7811 0.008296 -0.1385
## 22 2.678 -0.3783 1.1020 0.8500
## 192 3.891 -0.3459 0.08725 0.4076 -1.188 0.8671 0.014840
## 256 3.943 -0.2402 0.24550 0.3323 -1.241 0.7112 -0.094730 -0.2430
## 24 2.706 -0.3298 0.07660 1.1030 0.8531
## d.z^2):I(p.z^2 df logLik AICc delta weight
## 30 11 -6409.908 12841.9 0.00 0.369
## 32 12 -6409.775 12843.7 1.76 0.153
## 62 12 -6409.906 12844.0 2.02 0.134
## 96 13 -6409.357 12844.9 2.95 0.084
## 64 13 -6409.773 12845.7 3.78 0.056
## 160 -0.011000 13 -6409.774 12845.7 3.78 0.056
## 224 -0.142600 14 -6409.047 12846.3 4.35 0.042
## 128 14 -6409.358 12846.9 4.98 0.031
## 22 10 -6413.507 12847.1 5.18 0.028
## 192 -0.007982 14 -6409.777 12847.8 5.81 0.020
## 256 -0.168200 15 -6408.992 12848.2 6.27 0.016
## 24 11 -6413.383 12848.9 6.95 0.011
## Models ranked by AICc(x)
## Random terms (all models):
## 'd.z + I(d.z^2) | SiteCode'
Para avaliar o ajuste do modelo ao conjunto de dados utilizo funções do pacote MuMIn (REF) que permite calcular a predição do modelo médio para o conjunto original de dados.
Figura 1.7 Predições por sítio de amostragem do modelo médio calculado a partir do modelo global ; pontos: número de SADs neutras refutadas para uma bateria de simulações com um determinada distância média de dispersão; eixo x = distância média de dispersão / largura da área de amostragem; a linha é a probabilidade de não refutar uma SAD neutra segundo a predição média do conjunto de sub-modelos dentro do intervalo de plausibilidade de 7 (Burnham et al 2011)
Para avaliar o predito e intervalo de confiança de 95% pelo modelo médio utilizo funções do pacote AICcmodavg (REF).
Figura 1.8 Efeito predito de d e p na Probabilidade de não refutar segundo o modelo médio para MN==EE. No painel superior a predição média, nos paineis inferiores o intervalo de confiança.
Tabela 1.3.1 AICctab n_nRef MNEI
## dAICc df weight
## d + d^2|Site 0.0 15 1
## d|Site 7920.4 12 <0.001
## 1|Site 63552.4 10 <0.001
A função AICcmodavg::modavgPred aceita apenas a função de ligação canonica logito, então não irei comparar outras funções de ligação O modelo mais plausível considera um termo linear e quadrático para d na estrutura aletória. Segue seleção de variáveis.
Tabela 1.3.2 R2 marginal e condicional n_nRef MNEI
## R2m R2c
## theoretical 0.2834906 0.9613372
## delta 0.2808901 0.9525187
Figura 1.9 Resíduos Quantílicos do glmm cheio mais plausível para MNEI
# dados
df_md <- filter(df_resultados,MN=="EI")
# modelo global
global_md <- glmer(cbind(n_nRef,100-n_nRef) ~
( p.z + I(p.z^2) ) * ( d.z + I(d.z^2) ) +
(d.z + I(d.z^2)|SiteCode),
family = "binomial",data=df_md,
control=glmerControl(optimizer="bobyqa",optCtrl=list(maxfun=100000)),na.action = "na.fail")
Tabela 1.3.3 AICctab n_nRef MNEI delta<7
## Global model call: glmer(formula = cbind(n_nRef, 100 - n_nRef) ~ (p.z + I(p.z^2)) *
## (d.z + I(d.z^2)) + (d.z + I(d.z^2) | SiteCode), data = df_md,
## family = "binomial", control = glmerControl(optimizer = "bobyqa",
## optCtrl = list(maxfun = 1e+05)), na.action = "na.fail")
## ---
## Model selection table
## (Int) d.z d.z^2 p.z p.z^2 d.z:p.z d.z:I(p.z^2)
## 79 2.735 -2.147 0.052260 -0.9115
## 80 2.935 0.5378 -1.967 0.056100 -0.9083
## 208 3.151 0.5308 -2.186 -0.073260 -1.1270
## 207 2.952 -2.344 -0.068360 -1.1250
## 96 2.923 0.5179 -1.980 0.194700 -0.9040 0.3705
## 112 3.154 0.8376 -1.981 -0.009226 -1.1350 -0.3201
## 224 3.151 0.5320 -2.184 0.063220 -1.1270 0.3650
## 240 3.214 0.6970 -2.134 -0.074240 -1.1910 -0.1693
## 128 3.070 0.7209 -1.980 0.109200 -1.0510 0.2517 -0.2028
## 256 3.109 0.4198 -2.219 0.088050 -1.0840 0.4312 0.1148
## I(d.z^2):p.z d.z^2):I(p.z^2 df logLik AICc delta weight
## 79 -1.1980 11 -6288.847 12599.8 0.00 0.180
## 80 -1.1980 12 -6287.921 12600.0 0.17 0.165
## 208 -1.0710 0.2145 13 -6287.193 12600.6 0.74 0.124
## 207 -1.0830 0.2025 12 -6288.288 12600.7 0.91 0.114
## 96 -1.0740 13 -6287.311 12600.8 0.98 0.110
## 112 -1.1340 13 -6287.345 12600.9 1.04 0.107
## 224 -0.9524 0.2140 14 -6286.677 12601.6 1.74 0.075
## 240 -1.0710 0.1598 14 -6287.097 12602.4 2.58 0.050
## 128 -1.0740 14 -6287.169 12602.5 2.72 0.046
## 256 -0.9315 0.2507 15 -6286.649 12603.5 3.71 0.028
## Models ranked by AICc(x)
## Random terms (all models):
## 'd.z + I(d.z^2) | SiteCode'
Para avaliar o ajuste do modelo ao conjunto de dados utilizo funções do pacote MuMIn (REF) que permite calcular a predição do modelo médio para o conjunto original de dados.
Figura 1.10 Predito por SiteCode a partir do modelo médio para MNEI.
Figura 1.11 Efeito predito de d e p na Probabilidade de não refutar segundo o modelo médio para MN==EE. No painel superior a predição média, nos paineis inferiores o intervalo de confiança.
Figura 1.12 Probabilidade de não refutar uma SAD neutra em função do modelo neutro (EE e EI), proporção de cobertura vegetal (p) e distância média de dispersão (d)
Padrão Geral
Figura 2.1 diff_S (y-axis), p (x-axis).
l_md <- vector("list",9)
names(l_md) <- c("1-k 1|Site","1-k I(1-k)|Site",
"k 1|Site",
"d 1|Site","d d|Site",
"d/L 1|Site","d/L I(d/L)|Site",
"1 1|Site",
"1")
df_md <- df_resultados %>% filter(MN=="EE")
l_md[[1]] <- lmer(diff_S0 ~ (p.z + I(p.z^2)) * k_1.z + (1|SiteCode),
data=df_md,na.action = "na.fail")
l_md[[2]] <- lmer(diff_S0 ~ (p.z + I(p.z^2)) * k_1.z + (k_1.z|SiteCode),
data=df_md,na.action = "na.fail")
l_md[[3]] <- lmer(diff_S0 ~ (p.z + I(p.z^2)) * k + (1|SiteCode),
data=df_md,na.action = "na.fail")
l_md[[4]] <- lmer(diff_S0 ~ (p.z + I(p.z^2)) * d.z + (1|SiteCode),
data=df_md,na.action = "na.fail")
l_md[[5]] <- lmer(diff_S0 ~ (p.z + I(p.z^2)) * d.z + (d.z|SiteCode),
data=df_md,na.action = "na.fail")
l_md[[6]] <- lmer(diff_S0 ~ (p.z + I(p.z^2)) * d_Lplot.z + (1|SiteCode),
data=df_md,na.action = "na.fail")
l_md[[7]] <- lmer(diff_S0 ~ (p.z + I(p.z^2)) * d_Lplot.z + (d_Lplot.z|SiteCode),
data=df_md,na.action = "na.fail")
l_md[[8]] <- lmer(diff_S0 ~ 1 + (1|SiteCode),
data=df_md,na.action = "na.fail")
l_md[[9]] <- lm(diff_S0 ~ 1,
data=df_md,na.action = "na.fail")
AICctab(l_md,weights=T)
## dAICc df weight
## 1 0.0 2 0.928
## 1 1|Site 5.1 3 0.072
## 1-k 1|Site 73.3 8 <0.001
## 1-k I(1-k)|Site 73.6 10 <0.001
## d/L 1|Site 73.9 8 <0.001
## d 1|Site 74.0 8 <0.001
## d/L I(d/L)|Site 75.1 10 <0.001
## d d|Site 75.6 10 <0.001
## k 1|Site 711.9 62 <0.001
Alguns modelos utilizados para estimar diff_S apresentaram “singularidade” (estimativas não diferem de zero), dentre eles o único modelo plausível. Isso indica que modelo com a estrutura aleatória mais simples devem ser ajustados aos dados, assim vou descartar aqueles com inclinação para a variável de dispersão por Sítio.
l_md <- vector("list",6)
names(l_md) <- c("1-k 1|Site",
"k 1|Site",
"d 1|Site",
"d/L 1|Site",
"1 1|Site",
"1")
df_md <- df_resultados %>% filter(MN=="EE")
l_md[[1]] <- lmer(diff_S0 ~ (p.z + I(p.z^2)) * k_1.z + (1|SiteCode),
data=df_md,na.action = "na.fail")
l_md[[2]] <- lmer(diff_S0 ~ (p.z + I(p.z^2)) * k + (1|SiteCode),
data=df_md,na.action = "na.fail")
l_md[[3]] <- lmer(diff_S0 ~ (p.z + I(p.z^2)) * d.z + (1|SiteCode),
data=df_md,na.action = "na.fail")
l_md[[4]] <- lmer(diff_S0 ~ (p.z + I(p.z^2)) * d_Lplot.z + (1|SiteCode),
data=df_md,na.action = "na.fail")
l_md[[5]] <- lmer(diff_S0 ~ 1 + (1|SiteCode),
data=df_md,na.action = "na.fail")
l_md[[6]] <- lm(diff_S0 ~ 1,
data=df_md,na.action = "na.fail")
AICctab(l_md,weights=T)
## dAICc df weight
## 1 0.0 2 0.928
## 1 1|Site 5.1 3 0.072
## 1-k 1|Site 73.3 8 <0.001
## d/L 1|Site 73.9 8 <0.001
## d 1|Site 74.0 8 <0.001
## k 1|Site 711.9 62 <0.001
Nenhum destes modelos apresentou singularidade, o modelo nulo sem estrutura aleatória foi o único plausível. Segue gráfico diagnóstico:
Figura 2.2 Resíduos Quantílicos do modelo mais plausível para diff_S subset=MNEE (diff_S ~ 1)
Tabela 2.3 Sumário do modelo mais plausível para diff_S MNEE
##
## Call:
## lm(formula = diff_S0 ~ 1, data = df_md, na.action = "na.fail")
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.080599 -0.009762 0.000602 0.010029 0.054253
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.003539 0.000342 -10.35 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.01552 on 2059 degrees of freedom
Figura 2.3 diffS_EI ~p*k
Vou iniciar apenas com as preditoras de interesse (p e variáveis de dispersão). Devido a clara ausência de simetria de diff_S desloquei a distribuição apenas para valores positivos (figura 2.3 primeiro quadro) e utilizarei distribuição Gamma para ajustar os modelos com função de ligação ‘log’.
Figura 2.4 diff_S por sítio de amostragem e d
df_md <- df_resultados %>% filter(MN=="EI")
# df_md$diff_S %>% summary
l_md <- vector("list",6)
names(l_md) <- c("1|Site","d|Site",
"p2*k log",
"p2*d2 id 1|Site",
"p2*d2 id d|Site",
"p2*d2 id d2|Site")
# modelos mínimos
l_md[[1]] <- glmer(diff_S ~ p.z*d.z + (1|SiteCode),
data=df_md,family="Gamma"(link="log"))
l_md[[2]] <- glmer(diff_S ~ p.z*d.z + (d.z|SiteCode),
data=df_md,family="Gamma"(link="log"))
# com p2
## erro
l_md[[3]] <- glmer(diff_S ~ (p+I(p.z^2))*k + (1|SiteCode),
data=df_md,family="Gamma"(link="log"))
v_vars <- getME(l_md[[3]],c("theta","fixef"))
l_md[[3]] <- update(l_md[[3]],start=v_vars,control=glmerControl(optimizer="bobyqa",optCtrl=list(maxfun=2e5)))
l_md[[3]] <- glmer(diff_S ~ I(p.z^2)*k + (1|SiteCode),
data=df_md,family="Gamma"(link="log"))
# com p2 e d2
#######################
# Model failed to converge with max|grad| = 0.00556207 (tol = 0.002, component 1)Model is nearly unidentifiable: very large eigenvalue
# - Rescale variables?
l_md[[4]] <- glmer(diff_S ~ (p.z + I(p.z^2))*(d.z + I(d.z^2)) + (1|SiteCode),
data=df_md,family="Gamma"(link="log"))
v_vars <- getME(l_md[[4]],c("theta","fixef"))
l_md[[4]] <- update(l_md[[4]],start=v_vars,control=glmerControl(optimizer="bobyqa",optCtrl=list(maxfun=2e5)))
#######################
#######################
# Model failed to converge with max|grad| = 0.0608783 (tol = 0.002, component 1)Model is nearly unidentifiable: very large eigenvalue
# - Rescale variables?
l_md[[5]] <- glmer(diff_S ~ (p.z + I(p.z^2))*(d.z + I(d.z^2)) + (d.z|SiteCode),
data=df_md,family="Gamma"(link="log"))
v_vars <- getME(l_md[[5]],c("theta","fixef"))
l_md[[5]] <- update(l_md[[5]],start=v_vars,control=glmerControl(optimizer="bobyqa",optCtrl=list(maxfun=2e5)))
#######################
# Model failed to converge with max|grad| = 0.336616 (tol = 0.002, component 1)Model is nearly unidentifiable: very large eigenvalue
# - Rescale variables?
l_md[[6]] <- glmer(diff_S ~ (p.z + I(p.z^2))*(d.z + I(d.z^2)) + (d.z + I(d.z^2)|SiteCode),
data=df_md,family="Gamma"(link="log"))
v_vars <- getME(l_md[[6]],c("theta","fixef"))
l_md[[6]] <- update(l_md[[6]],start=v_vars,control=glmerControl(optimizer="bobyqa",optCtrl=list(maxfun=2e5)))
#######################
## dAICc df weight
## p2*k log 0.0 42 1
## p2*d2 id d2|Site 5496.0 16 <0.001
## p2*d2 id d|Site 5810.5 13 <0.001
## p2*d2 id 1|Site 5842.6 11 <0.001
## d|Site 8272.9 8 <0.001
## 1|Site 8300.0 6 <0.001
Não foi possível ajustar os modelos com estrutura fixa mais complexa. Vou avaliar se GAMM oferecem melhor ajuste aos dados
l_md <- vector("list",4)
names(l_md) <- c("tp by=k","cr by=k",
"tp ti","cr ti")
l_md[[1]] <- gam(diff_S ~ s(p.z,by=k,bs="tp") +
s(SiteCode,bs="re"),
data=df_md,family = "Gamma"(link="log"))
l_md[[2]] <- gam(diff_S ~ s(p.z,by=k,bs="cr") +
s(SiteCode,bs="re"),
data=df_md,family = "Gamma"(link="log"))
l_md[[3]] <- gam(diff_S ~ s(p.z,bs="tp") + s(d.z,bs="tp") + ti(p.z,d.z,bs=c("tp","tp")) +
s(SiteCode,bs="re"),
data=df_md,family = "Gamma"(link="log"))
l_md[[4]] <- gam(diff_S ~ s(p.z,bs="cr") + s(d.z,bs="cr") + ti(p.z,d.z,bs=c("cr","cr")) +
s(SiteCode,bs="re"),
data=df_md,family = "Gamma"(link="log"))
## dAICc df weight
## cr ti 0.0 127.257591150728 1
## tp ti 1081.0 126.582457404983 <0.001
## cr by=k 13007.1 115.96208485403 <0.001
## tp by=k 13007.1 115.962163752688 <0.001
O único modelo cheio plausível considera as variáveis p e d (um smoother para cada mais um tensor para ambas) e 1 intercepto por Sítio de Amostragem.
Figura 2.5 Gráficos Diagnostico do gamm cheio mais plausível para diff_S MN==EI
De maneira geral o modelo esta fazendo um bom ajuste, contudo alguns sítios distoam do padrão geral dos dados. Há duas alternativas: i) possibilitar um smoother por sítio de amostragem com um parâmetro de penalização comum; ou ii) remover sítios outliers.
l_md <- vector("list",2)
names(l_md) <- c("1|Site","d|Site")
l_md[[1]] <- gam(diff_S ~ s(p.z,bs="cr") + s(d.z,bs="cr") + ti(p.z,d.z,bs=c("cr","cr")) +
s(SiteCode,bs="re"),
data=df_md,family = "Gamma"(link="log"))
l_md[[2]] <- gam(diff_S ~ s(p.z,bs="cr") + s(d.z,bs="cr") + ti(p.z,d.z,bs=c("cr","cr")) +
s(d.z,SiteCode,bs="fs",xt="cr"),
data=df_md,family = "Gamma"(link="log"))
## dAICc df
## d|Site 0.0 472.606086811532
## 1|Site 858.6 127.257591150728
Figura 2.6 Gráfico Diagnóstico gamm cheio com segunda estrutra aleatória diff_S MM==EI
Figura 2.7 gratia::draw() gamm mais plausível com estrutura similar a (d|Site)
Este modelo apresenta problema de concurvidade. Assim vou refazer a comparação com configuração adequada:
df_md <- filter(df_resultados,MN=="EI")
md_gam.diff_S.EI__update <- gam(diff_S ~ s(p.z,bs="cr") + s(d.z,bs="cr") + ti(p.z,d.z,bs=c("cr","cr")) +
s(d.z,SiteCode,bs="fs",xt=list(bs="cp"), m=1),
data=df_md,family = "Gamma"(link="log"))
Figura 2.8 Update do modelo da figura 2.7 com o smoother da estrutura aleatória penalizada pela 1a derivada para diminuir a concurvidade (Perdersen et al. 2019)
O modelo diminuiu a concurvidade da estimativa.
Figura 2.9 Appraise do gamm cheio atualizado (smoother de estrutura aleatória: m=1).
Remoção sítios com observações fora do intervalo [-1.5;1.5] dos resíduos deviance.
# dados completos
df_md <- df_resultados %>% filter(MN=="EI")
df_md$resDev <- residuals.gam(md_gam.diff_S.EI__update)
# sítios considerados outliers
v_SiteOut <- df_md %>% filter(resDev < -0.15 | resDev > 0.15) %>% .$SiteCode %>% unique
# update da comparação
l_md <- vector("list",2)
names(l_md) <- c("1|Site","d|Site")
l_md[[1]] <- gam(diff_S ~ s(p.z,bs="cr") + s(d.z,bs="cr") + ti(p.z,d.z,bs=c("cr","cr")) +
s(SiteCode,bs="re"),
data=filter(df_md,!(SiteCode %in% v_SiteOut)),
family = "Gamma"(link="log"))
l_md[[2]] <- gam(diff_S ~ s(p.z,bs="cr") + s(d.z,bs="cr") + ti(p.z,d.z,bs=c("cr","cr")) +
s(d.z,SiteCode,bs="fs",xt=list(bs="cp"),m=1),
data=filter(df_md,!(SiteCode %in% v_SiteOut)),
family = "Gamma"(link="log"))
## dAICc df weight
## d|Site 0.0 324.888880261917 1
## 1|Site 472.9 123.947848190999 <0.001
Figura 2.10 Gráficos diagnóstico do gamm cheio mais plausível sem outliers
A remoção de outliers não melhorou o ajuste do modelo.
Figura 2.11 Efeitos estimados para o gamm cheio diffS_EI sOut
Figura 3.1 Observado (pontos) e predito (linhas) para diffS e n_nRef (segunda linha no facet) em função de d*MN, por sítio de amostragem (primeira linha no facet).
Figura 3.2 |diffS| ~ n_nRef * k, subset=MNEI
Figura 3.3 n_nRef ~ |diffS| (~SiteCode), subset=MNEI
Estratégia
cbind(n_nRef,100-n_nRef) ~ log(modulo_diffS) * d + ( log(modulo_diffS) * d | SiteCode)
figura 4.1 U ~ padrões gerais
Figura 4.2 U ~ d (~SiteCode)
Variável de dispersão: d (como para n_nRef)
Figura 4.3 Graf Diag Gamm cheio mais plausível